package com.itlaobing.demo.listener;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.util.List;
import java.util.Map;

/**
 * @Classname SessionAttributeListener
 * @Description TODO()
 * @Date 2020/11/13 0013 10:03
 * @Author by Administrator
 * @Version v1.0
 */
@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        // 新增属性 session.setAttribute(key,value) key之前不存在
        String key = httpSessionBindingEvent.getName();
        if ("user".equals(key)){
            // 同一用户不同地方登录
            HttpSession session = httpSessionBindingEvent.getSession();
            // 表示登录成功, 在线用户数量 +1， 将这个在线用户保存起来
            ServletContext context = session.getServletContext();
            // 在线人数
            Integer num = (Integer) context.getAttribute("onlineNum");
            if (num == null) {
                num = 0;
            }
            // 在线人数 +1 , 更新在线人数
            context.setAttribute("onlineNum", ++num);
            // 在线用户
            Map<String, HttpSession> map = (Map<String, HttpSession>) context.getAttribute("onlineUsers");
            // 将当前登录的用户 存储起来
            map.put(session.getId(), session);
        }
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        // 删除属性 removeAttribute(key)
        String key = httpSessionBindingEvent.getName();
        if ("user".equals(key)){
            HttpSession session = httpSessionBindingEvent.getSession();
            // 表示注销, 在线用户数量 -1
            ServletContext context = session.getServletContext();
            // 在线人数
            Integer num = (Integer) context.getAttribute("onlineNum");
            // 在线人数 , 更新在线人数
            context.setAttribute("onlineNum", --num);
            // 在线用户
            Map<String, HttpSession> map = (Map<String, HttpSession>) context.getAttribute("onlineUsers");
            map.remove(session.getId());
        }
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        //替换属性 setAttribute(key, value) key 已经存在
    }
}
